package com.woniuxy.topicRouting;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.woniuxy.utils.RabbitConnection;
import lombok.extern.log4j.Log4j2;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeoutException;

/**
 * @Author: linKe
 * @Date: 2022/1/10 15:49
 * @FileName: Producer
 * @version: 1.0
 * @Description: Topic模式 通配符指定路由
 * 生产者类 发送消息
 */
@Log4j2
public class ProducerTopic {

    public static void main(String[] args) throws IOException, TimeoutException {
        // 连接工厂：配置；连接参数，创建连接对象
        ConnectionFactory connectionFactory = new ConnectionFactory();
        // 增强编辑
        connectionFactory.setHost("127.0.0.1");
        // 发消息的通信端口 5672 （15672是页面管理监测端口）
        connectionFactory.setPort(5672);
        // 设置虚拟主机  类似redis服务器中一个具体的操作库  默认/
        connectionFactory.setVirtualHost("/");
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
        // 连接对象
        Connection connection = connectionFactory.newConnection();
        // 连接通道
        Channel channel = connection.createChannel();
        /*
        发送消息  Simplest模式使用的是默认交换机
        参数：
            (String exchange, String routingKey, BasicProperties props, byte[] body)
            exchange - 交换机（使用默认交换机） 将消息发布到的交换   生成的消息先进入交换机，交换机根据路由规则，将消息投递到指定的队列
            routingKey – 路由键（消息队列名） Simplest模式就是消息队列名
            props - 消息的其他属性 - 路由标头等
            body - 正文 消息正文
                sms 指定路由，调用sms对应的消费者服务
                sms.email 通配符指定 调用两个路由对应的消费者服务
         */
        for (int i = 1; i < 11; i++) {
            channel.basicPublish("exchangeTopic", "sms", null, ("只发送短信..."+i).getBytes(StandardCharsets.UTF_8));
            channel.basicPublish("exchangeTopic", "sms.email", null, ("同时发送邮箱和短信..."+i).getBytes(StandardCharsets.UTF_8));
            log.info("发送成功");
        }
        // 关闭资源
        // 关闭资源
        RabbitConnection.close(connection,channel);
    }
}
